#ifndef __SCENE_SIM_HPP__
#define __SCENE_SIM_HPP__

#include<string>
#include<atomic>
#include<stdint.h>
#include<memory>
#include<thread>

namespace SC_SUN
{

    class FuncApp;

    class SceneSim
    {

    protected:
        FuncApp& mApp;
        std::string mCurScene;                  ///< 当前场景

        //场景仿真相关信息
        double mSatStep;                        ///< 卫星数据步长
        double mGNSSTotal;                      ///< GNSS仿真总时长
        double mGNSSStep;                       ///< GNSS数据步长
        double mSecTotal;                       ///< 星间数据仿真总时长
        double mSecStep;                        ///< 星间数据仿真步长

        //推演相关数据
        std::atomic<bool> mIsQuit = false;      ///< 推演线程退出标志
        std::atomic<bool> mIsPlay = false;      ///< 播放/暂停标志
        uint32_t mTotalFrame = 0;               ///< 仿真总帧数
        uint32_t mCurFrame = 0;                 ///< 当前仿真帧数
        std::thread* mPlayThd = nullptr;        ///< 推演线程
        

        void SetDefaultScene();

    public:
        SceneSim(FuncApp& app);
        ~SceneSim();

        bool Start();
        void Stop();

        //播放控制相关函数
        bool Play();                                        ///< 开始推演
        bool Pause();                                       ///< 暂停推演
        bool PreFrame();                                    ///< 推演上一帧
        bool NextFrame();                                   ///< 推演下一帧
        void ResetPlay();                                   ///< 重置推演状态

        //客户端设置当前计划场景
        void SetCurScene(const std::string& scene);
    };
}
#endif